FROM php:8.1-alpine

# root 用户
USER root

# 工作目录
WORKDIR /data

# 构建指定参数
# docker build -t webman:v-66 --build-arg USERNAME=www --build-arg USERID=1001 .

# 解决文件挂在容器内外权限不一致问题
# USERNAME 用户名 必须主服务器存在的用户
ARG USERNAME=www
# USERID 用户id 对应的用户id
ARG USERID=1001

# 容器启动命令 常驻后台 start.sh 文件内容如下一行
# cd /data && composer install --optimize-autoloader --no-dev && php start.php start -d && tail -n 1 -f /etc/passwd
COPY ./scripts/start.sh /start.sh

# docker compose exec webman 后面可以跟要在容器内执行的命令 webman 是 docker-compose.yml 文件中 service 下的名称
# restart 命令重启 master 进程以及子进程 docker compose exec webman php start.php restart -d
# reload 命令更新 worker 进程 docker compose exec webman php start.php reload
# composer 命令 composer 包管理相关 docker compose exec webman composer install --optimize-autoloader --no-dev

# composer 包管理 提前下载好指定版本 构建过程中下载非常慢 否则可能一直卡在提示 Downloading.. 
# 下面的 curl -sS https://getcomposer.org/installer | php 可以不需要 二选一
# https://getcomposer.org/versions 获取所有的 composer 版本
# https://getcomposer.org/download/2.7.9/composer.phar 下载指定版本
COPY ./scripts/composer/2.7.9/composer.phar /usr/local/bin/composer

# 解压php源代码
RUN docker-php-source extract \
    # 修改 start.sh 可执行
    && chmod a+x /start.sh \
    # 修改镜像地址
    && sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
    # 更新缓存
    && apk update \
    # 安装需要的基础包
    && apk add autoconf linux-headers libevent-dev openssl-dev zlib-dev libpng-dev freetype-dev libjpeg-turbo-dev gettext-dev icu-dev libxml2-dev libzip-dev \
    # 扩展源代码 下载 pecl 扩展 也可以提前下载好 COPY
    && cd /usr/src/php/ext \
    # 下载 event 扩展到扩展源代码目录
    && wget https://pecl.php.net/get/event-3.0.8.tgz && tar xvf event-3.0.8.tgz && mv event-3.0.8 event \
    # 下载 redis 扩展到扩展源代码目录
    && wget https://pecl.php.net/get/redis-6.0.2.tgz && tar xvf redis-6.0.2.tgz && mv redis-6.0.2 redis \
    # 下载 igbinary 扩展到扩展源代码目录
    && wget https://pecl.php.net/get/igbinary-3.2.12.tgz && tar xvf igbinary-3.2.12.tgz && mv igbinary-3.2.12 igbinary \
    # 配置 gd 扩展
    && docker-php-ext-configure gd --enable-gd --with-freetype --with-jpeg \
    # 安装扩展
    && docker-php-ext-install -j$(nproc) pcntl sockets pdo_mysql gd exif bcmath gettext intl shmop soap sysvsem zip mysqli event redis igbinary \
    # 开启 opcache
    && docker-php-ext-enable opcache \
    # 重要 配置 event 扩加载顺序 到 sockets 后面 不然会报错 提示找不到 socket 相关函数
    && mv /usr/local/etc/php/conf.d/docker-php-ext-event.ini /usr/local/etc/php/conf.d/docker-php-ext-z1-event.ini \
    # 安装 composer 可能非常慢 一直卡在提示 Downloading... 可以 CTRL + C 后重新构建
    # && curl -sS https://getcomposer.org/installer | php && mv composer.phar /usr/local/bin/composer \
    # 修改 composer 可执行
    && chmod a+x /usr/local/bin/composer \
    # 设置 composer 镜像仓库
    && composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ \
    # 切换到工作目录
    && cd /data \
    # 删除 php 源代码
    && docker-php-source delete \
    # 创建 www 用户并且指定 用户 id 根据实际情况创建 cat /etc/passwd 查看
    && adduser -u ${USERID} -g "dockerfileuser" -s /bin/sh -D ${USERNAME}

# 切换成 指定 用户
USER ${USERNAME}

# 定义启动脚本
CMD [ "/start.sh" ]
